From: Matthias Clasen Date: Fri, 31 Jul 2015 11:03:25 +0000 (-0400) Subject: file chooser: Allow activating without double-click X-Git-Tag: archive/raspbian/3.24.39-1+rpi1~1^2~65^2~39^2~6007 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=fb0a13b7f070a14312dafa1e4df6ba03cf33be01;p=gtk%2B3.0.git file chooser: Allow activating without double-click Interpret a unmodified primary click on the selection like a double click. This makes it possible to activate a file or open a folder without using double-click. --- diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 75470a8b7a..47f595f0e5 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -75,6 +75,7 @@ #include "gtkseparator.h" #include "gtkmodelbutton.h" #include "gtkgesturelongpress.h" +#include "gtkdebug.h" #include @@ -2341,6 +2342,25 @@ list_popup_menu_cb (GtkWidget *widget, return TRUE; } +static void +get_selection_modifiers (GtkWidget *widget, + GdkEventButton *event, + gboolean *modify, + gboolean *extend) +{ + GdkModifierType mask; + + *modify = FALSE; + *extend = FALSE; + + mask = gtk_widget_get_modifier_mask (widget, GDK_MODIFIER_INTENT_MODIFY_SELECTION); + if ((event->state & mask) == mask) + *modify = TRUE; + mask = gtk_widget_get_modifier_mask (widget, GDK_MODIFIER_INTENT_EXTEND_SELECTION); + if ((event->state & mask) == mask) + *extend = TRUE; +} + /* Callback used when a button is pressed on the file list. We trap button 3 to * bring up a popup menu. */ @@ -2351,10 +2371,39 @@ list_button_press_event_cb (GtkWidget *widget, { GtkFileChooserWidgetPrivate *priv = impl->priv; static gboolean in_press = FALSE; + GtkTreePath *path; + GtkTreeViewColumn *column; + GdkDevice *device; + gboolean modify, extend, is_touchscreen; if (in_press) return FALSE; + device = gdk_event_get_source_device ((GdkEvent *) event); + is_touchscreen = gtk_simulate_touchscreen () || + gdk_device_get_source (device) == GDK_SOURCE_TOUCHSCREEN; + + get_selection_modifiers (widget, event, &modify, &extend); + if (!is_touchscreen && + !modify && !extend && + event->button == GDK_BUTTON_PRIMARY && + gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (priv->browse_files_tree_view), + event->x, event->y, + &path, &column, NULL, NULL)) + { + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->browse_files_tree_view)); + if (gtk_tree_selection_path_is_selected (selection, path)) + { + list_row_activated (GTK_TREE_VIEW (priv->browse_files_tree_view), path, column, impl); + gtk_tree_path_free (path); + return TRUE; + } + + gtk_tree_path_free (path); + } + if (!gdk_event_triggers_context_menu ((GdkEvent *) event)) return FALSE;